package com.shejimoshi.单例模式.枚举的方式;

/**
 * 在枚举中我们明确了构造方法限制为私有，在我们访问枚举实例时会执行构造方法，
 * 同时每个枚举实例都是static final类型的，也就表明只能被实例化一次。在调用构造方法时，我们的单例被实例化。
 * 也就是说，因为enum中的实例被保证只会被实例化一次，所以我们的INSTANCE也被保证实例化一次。
 *
 * 单元素的枚举类型已经成为实现Singleton的最佳方法--《Effective Java》
 * 所有的枚举元素，都是该枚举的一个实例
 *
 * 优点： 通过jdk1.5中添加的枚举来实现单例模式， 写法简单，
 *        且不仅能够避免多线程的问题，而且还能防止反序列化重新创建对象
 */
public enum Singleton { // 必须要单个元素
    SINGLETON(10, "金玉宝") {
        @Override
        public void doSomethig() {
            System.out.println("我做了某件事！");
        }

        public void doOnething() {
            System.out.println("我做了一件事！");
        }
    };

    private int age;

    private String name;

    private Singleton(int age, String name) {
        this.age = age;
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    // 重写toString方法


    @Override
    public String toString() {
        return "Singleton{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }

    // 定义一个可以继承的通用方法
    public void doSomethig() {}

    // 定义一个实例可以实现的抽象方法
    public abstract void doOnething();
}
